package com.wangzhen.spring.resource;

import com.wangzhen.spring.ioc.dependcy.entity.User;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.MapPropertySource;
import org.springframework.core.env.MutablePropertySources;

import java.util.HashMap;
import java.util.Map;

/**
 * 使用外部化配置注解演示示例demo
 * 1、演示@PropertySource注解导入外部属性配置文件
 * 2、该属性配置是可以Repeatable重复在类型标注的（jdk1.8特性）
 * 3、可以使用@Value注解导入
 * 4、通过context.getEnvironment().getPropertySources().addFirst(propertySourceMap);
 *  添加自定义的PropertySource到首位之后，观察property优先级，理解如果出现key相同的属性，只会取优先级高的。
 */


/*user.id = userId
user.age = 20
user.name=大王*/
@PropertySource("classpath:/META-INF/user.properties")
@PropertySource("classpath:/META-INF/addr.properties")
public class PropertySourceAnnotationDemo {

    @Bean
    public User user(@Value("${user.age}") Integer age, @Value("${user.name}") String name) {
        User user = new User();
        user.setAge(age);
        user.setName(name);
        return user;
    }

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        // 通过使用PropertySource的子类--》MapPropertySource--》来自定义添加一个key/value键值对
        Map<String, Object> propertyMap = new HashMap<>();
        propertyMap.put("user.name", "myUserName");
        org.springframework.core.env.PropertySource<Map<String, Object>> propertySourceMap = new MapPropertySource("myPropertyMap", propertyMap);
        // 将自定义的PropertySource添加到NO.1的位置
        // 让我们看一下添加到No.1的文字，注入User对象的name是什么？
        // 此时propertyMap的优先级高于/META-INF/user.properties中的user.name属性
        context.getEnvironment().getPropertySources().addFirst(propertySourceMap);

        context.register(PropertySourceAnnotationDemo.class);

        context.refresh();

        Object user = context.getBean("user");
        // 打印输出User对象的name字段时会发现一个问题，name字段的取值并不是来自user.properties文件的配置，
        // 而是输出的wangzhen（貌似被其它高优先级-同名的配置给覆盖掉了）
        // context.getEnvironment().getPropertySources().addFirst(propertySourceMap);  通过将自定义的PropertySource添加到首位之后，再观察一下输出的user对象值
        System.out.println(user);
        // 打印当前context的外部化配置文件
        MutablePropertySources propertySources = context.getEnvironment().getPropertySources();
        System.out.println(propertySources);

        context.close();
    }


}
